/*
 * Copyright (C) 2015 The Android  Source Project 
 *
 * Licensed under the Apache License, Version 1.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at 
 *
 *      http://www.ido517.com
 *
 * Unless required by applicable law or agreed to in writing, software 
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and 
 * limitations under the License.
 */
package utils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

/**
 * @Description TODO
 * @author 李文伟
 * @email lvsedewenzi@163.com
 * @date 2015-8-31 下午2:27:24
 */
/**
 * 日期工具类(未特别说明的均为系统默认时区下的时间)
 * */
public class DateUtil {

	/** 1s==1000ms */
	private final static int TIME_MILLISECONDS = 1000;
	/** 时间中的分、秒最大值均为60 */
	private final static int TIME_NUMBERS = 60;
	/** 时间中的小时最大值 */
	private final static int TIME_HOURSES = 24;
	/** 格式化日期的标准字符串 */
	private final static String FORMAT = "yyyy-MM-dd HH:mm:ss";

	/**
	 * 获取时区信息
	 * */
	public static TimeZone getTimeZone() {
		return TimeZone.getDefault();
	}

	/**
	 * 将日期字符串转换为Date对象
	 * 
	 * @param date
	 *            日期字符串，必须为"yyyy-MM-dd HH:mm:ss"
	 * @return 日期字符串的Date对象表达形式
	 * */
	public static Date parseDate(String date) {
		return parseDate(date, FORMAT);
	}

	/**
	 * 将日期字符串转换为Date对象
	 * 
	 * @param date
	 *            日期字符串，必须为"yyyy-MM-dd HH:mm:ss"
	 * @param format
	 *            格式化字符串
	 * @return 日期字符串的Date对象表达形式
	 * */
	public static Date parseDate(String  date, String format) {
		Date dt = null;
		SimpleDateFormat dateFormat = new SimpleDateFormat(format);
		try {
			dt = dateFormat.parse(date);
		} catch (ParseException e) {
			e.printStackTrace();
		}

		return dt;
	}

	/**
	 * 将Date对象转换为指定格式的字符串
	 * 
	 * @param date
	 *            Date对象
	 * @return Date对象的字符串表达形式"yyyy-MM-dd HH:mm:ss"
	 * */
	public static String formatDate(Date date) {
		return formatDate(date, FORMAT);
	}

	/**
	 * 将Date对象转换为指定格式的字符串
	 * 
	 * @param date
	 *            Date对象
	 * @param String
	 *            format 格式化字符串
	 * @return Date对象的字符串表达形式
	 * */
	public static String formatDate(Date date, String format) {
		SimpleDateFormat dateFormat = new SimpleDateFormat(format);
		return dateFormat.format(date);
	}

	/**
	 * 格式化日期
	 * 
	 * @param long unixTime unix时间戳
	 * @return 日期字符串"yyyy-MM-dd HH:mm:ss"
	 * */
	public static String formatUnixTime(long unixTime) {
		return formatUnixTime(unixTime, FORMAT);
	}

	/**
	 * 格式化日期
	 * 
	 * @param long unixTime unix时间戳
	 * @param String
	 *            format 格式化字符串
	 * @return 日期字符串
	 * */
	public static String formatUnixTime(long unixTime, String format) {
		SimpleDateFormat dateFormat = new SimpleDateFormat(format);
		return dateFormat.format(unixTime);
	}

	/**
	 * 将GMT日期格式化为系统默认时区的日期字符串表达形式
	 * 
	 * @param gmtUnixTime
	 *            GTM时间戳
	 * @return 日期字符串"yyyy-MM-dd HH:mm:ss"
	 * */
	public static String formatGMTUnixTime(long gmtUnixTime) {
		return formatGMTUnixTime(gmtUnixTime, FORMAT);
	}

	/**
	 * 将GMT日期格式化为系统默认时区的日期字符串表达形式
	 * 
	 * @param gmtUnixTime
	 *            GTM时间戳
	 * @param format
	 *            格式化字符串
	 * @return 日期字符串"yyyy-MM-dd HH:mm:ss"
	 * */
	public static String formatGMTUnixTime(long gmtUnixTime, String format) {
		SimpleDateFormat dateFormat = new SimpleDateFormat(format);
		return dateFormat.format(gmtUnixTime
				+ TimeZone.getDefault().getRawOffset());
	}

	/**
	 * 获取时间戳的Date表示形式
	 * 
	 * @param unixTime
	 *            unix时间戳
	 * @return Date对象
	 * */
	public static Date getDate(long unixTime) {
		return new Date(unixTime);
	}

	/**
	 * 获取时间String表示形式
	
	 * @return String对象
	 * */
	public static String getDateString() {
		SimpleDateFormat sDateFormat = new SimpleDateFormat(
				"yyyy-MM-dd HH:mm:ss");
		return sDateFormat.format(new Date());
	}

	/**
	 * 获取GMT时间戳的Date表示形式（转换为Date表示形式后，为系统默认时区下的时间）
	 * 
	 * @param gmtUnixTime
	 *            GMT Unix时间戳
	 * @return Date对象
	 * */
	public static Date getGMTDate(long gmtUnixTime) {
		return new Date(gmtUnixTime + TimeZone.getDefault().getRawOffset());
	}

	/**
	 * 将系统默认时区的Unix时间戳转换为GMT Unix时间戳
	 * 
	 * @param unixTime
	 *            unix时间戳
	 * @return GMT Unix时间戳
	 * */
	public static long getGMTUnixTime(long unixTime) {
		return unixTime - TimeZone.getDefault().getRawOffset();
	}

	/**
	 * 将GMT Unix时间戳转换为系统默认时区的Unix时间戳
	 * 
	 * @param gmtUnixTime
	 *            GMT Unix时间戳
	 * @return 系统默认时区的Unix时间戳
	 * */
	public static long getCurrentTimeZoneUnixTime(long gmtUnixTime) {
		return gmtUnixTime + TimeZone.getDefault().getRawOffset();
	}

	/**
	 * 获取当前时间的GMT Unix时间戳
	 * 
	 * @return 当前的GMT Unix时间戳
	 * */
	public static long getGMTUnixTimeByCalendar() {
		Calendar calendar = Calendar.getInstance();
		// 获取当前时区下日期时间对应的时间戳
		long unixTime = calendar.getTimeInMillis();
		// 获取标准格林尼治时间下日期时间对应的时间戳
		long unixTimeGMT = unixTime - TimeZone.getDefault().getRawOffset();
		return unixTimeGMT;
	}

	/**
	 * 获取当前时间的Unix时间戳
	 * 
	 * @return 当前的Unix时间戳
	 * */
	public static long getUnixTimeByCalendar() {
		Calendar calendar = Calendar.getInstance();
		// 获取当前时区下日期时间对应的时间戳
		long unixTime = calendar.getTimeInMillis();
		return unixTime;
	}

	/**
	 * 获取更改时区后的时间
	 * 
	 * @param date
	 *            时间
	 * @param oldZone
	 *            旧时区
	 * @param newZone
	 *            新时区
	 * @return 时间
	 */
	public static Date changeTimeZone(Date date, TimeZone oldZone,
			TimeZone newZone) {
		Date dateTmp = null;
		if (date != null) {
			int timeOffset = oldZone.getRawOffset() - newZone.getRawOffset();
			dateTmp = new Date(date.getTime() - timeOffset);
		}
		return dateTmp;
	}

	/**
	 * 将总秒数转换为时分秒表达形式
	 * 
	 * @param seconds
	 *            任意秒数
	 * @return %s小时%s分%s秒
	 */
	public static String formatTime(long seconds) {
		long hh = seconds / TIME_NUMBERS / TIME_NUMBERS;
		long mm = (seconds - hh * TIME_NUMBERS * TIME_NUMBERS) > 0 ? (seconds - hh
				* TIME_NUMBERS * TIME_NUMBERS)
				/ TIME_NUMBERS
				: 0;
		long ss = seconds < TIME_NUMBERS ? seconds : seconds % TIME_NUMBERS;
		return (hh == 0 ? "" : (hh < 10 ? "0" + hh : hh) + "小时")
				+ (mm == 0 ? "" : (mm < 10 ? "0" + mm : mm) + "分")
				+ (ss == 0 ? "" : (ss < 10 ? "0" + ss : ss) + "秒");
	}

	/**
	 * 获取当前时间距离指定日期时差的大致表达形式
	 * 
	 * @param long date 日期
	 * @return 时差的大致表达形式
	 * */
	public static String getFormatTime(long date) {

		String strTime = "很久很久以前";
		long time = Math.abs(new Date().getTime() - date * 1000);

		int sec = (int) (time / TIME_MILLISECONDS);
		if (sec <= TIME_NUMBERS) { // 一分钟以内
			strTime = sec + "秒前";
		} else {
			int min = sec / TIME_NUMBERS;
			if (min < TIME_NUMBERS) { // 一小時以内
				if (min <= 30) {
					strTime = min + "分钟前";
				} else {
					strTime = "半小时前";
				}
			} else {
				int hh = min / TIME_NUMBERS;
				if (hh <= TIME_HOURSES) { // 一天以內
					strTime = hh + "小时前";
				} else {
					int days = hh / TIME_HOURSES;
					if (days <= 6) {// 一周以內
						strTime = days + "天前";
					} else {
						int weeks = days / 7;
						if (weeks <= 4) {
							strTime = weeks + "周前";
						} else {
							int months = days / 30;
							if (months <= 6) {
								strTime = months + "月前";
							} else if (months <= 12) {
								strTime = "半年前";
							} else {
								int years = months / 12;
								if (years <= 6) {
									strTime = years + "年前";
								} else {
									strTime = "6年前";
								}
							}
						}
					}
				}
			}
		}

		return strTime;
	}
}
